/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package fr.utbm.tx52.stamp.ui.widget;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.widget.RemoteViews;
import fr.utbm.tx52.stamp.R;
import fr.utbm.tx52.stamp.logic.Constant;
import fr.utbm.tx52.stamp.logic.algorithm.SortAlgorithms;
import fr.utbm.tx52.stamp.logic.utils.FileUtil;
import fr.utbm.tx52.stamp.ui.activity.Main;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;

/**
 * Classe permettant de prendre en charge le Widget
 * @author GeoffreyTisserand
 * @author NathanBardoux
 */
public class WidgetProvider extends AppWidgetProvider {
	
	// Action lancée lorsque l'on clique sur l'image dans le widget
	public static final String ACTION_LANCER_APPLICATION = "fr.utbm.tx52.widget.action.OPEN_APP";

	/**
	 * Fonction appelée lorsque le Widget est mis-àjour
	 * @param context le contexte courant
	 * @param appWidgetManager  le manager des widgets
	 * @param appWidgetIds les id de tous les widgets de l'application
	 */
	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
		
		//On récupère les ids des widgets
		ComponentName thisWidget = new ComponentName(context, WidgetProvider.class);
		int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
		
		// Pour chaque widget
		for(int widgetId : allWidgetIds){
			
			// On récupère la vue du widget
			RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);

			// On récupère les fichiers images présent dans Stamp
			ArrayList<File> tmp = FileUtil.getSDCardContent();
			ArrayList<File> files = new ArrayList<File>();
			for (File file : tmp){
				if (Constant.FILE_IMAGE_EXTENSION.contains(FileUtil.getExtension(file.getName()))){
					files.add(file);
				}
			}
			// On tri par date ces images
			SortAlgorithms sort = new SortAlgorithms(files);
			files = sort.sortByDate(true);
			
			// Si on a au moins une image
			if (files.size() > 0){
				// On change le widget pour afficher cette image
				BitmapFactory.Options options = new BitmapFactory.Options();
				options.inSampleSize = 2;
				Bitmap currentBitmap = null;	
				try{
					currentBitmap = BitmapFactory.decodeStream(new FileInputStream(files.get(files.size()-1)), null, options);
				}catch (FileNotFoundException e){}
				remoteViews.setImageViewBitmap(R.id.photowidget,currentBitmap);
			}else{
				// Sinon on affiche une image par défaut
				Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_menu_light_picture);
				remoteViews.setImageViewBitmap(R.id.photowidget, bitmap);
			}
			
			// Intent permettant de rafraichir le widget
			Intent intent = new Intent(context, WidgetProvider.class);
			intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
			intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
			PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
			remoteViews.setOnClickPendingIntent(R.id.logowidget, pendingIntent);
			
			// Intent permettant de lancer l'application lorsque l'on clique sur l'image
			Intent intent2 = new Intent(ACTION_LANCER_APPLICATION);
			PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, 0, intent2, PendingIntent.FLAG_UPDATE_CURRENT);
			remoteViews.setOnClickPendingIntent(R.id.photowidget, pendingIntent2); 
			
			appWidgetManager.updateAppWidget(widgetId, remoteViews);
			
			//appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
		}
	}
	
	/**
	 * Permet de recevoir les intent envoyées par le Widget
	 * @param context
	 * @param intent 
	 */
	@Override
	public void onReceive(Context context, Intent intent){
		super.onReceive(context, intent);
		// Si c'est une intent pour ouvrir l'application
		if (intent.getAction().equals(ACTION_LANCER_APPLICATION)){
			// On lance Stamp
			Intent i = new Intent(context, Main.class);
			i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			context.startActivity(i);
		}
	}
} 